#include<bits/stdc++.h>
using namespace std;
int r[10000005];
int n,m,V,l,p[100005],cnt,t,tmp;
struct car{
	int d,v,a;
	pair<int,int> h(){
		if(a==0){
			if(v>V){
				return make_pair(d,l);
			}else{
				return make_pair(-1,-1);
			}
		}
		int tp=ceil((V*V-v*v)/2.0/a);
		if((tp<0&&a<0)||(tp>l-d&&a>0)){
			return make_pair(-1,-1);
		}
		if(a>0){
			return make_pair(max(tp+1+d,d),l);
		}else{
			return make_pair(d,min(l,tp-1+d));
		}
	}
}c[100005];
stack<int>rg,sm,val,fans;
int main(){
	freopen("detect.in","r",stdin);
	freopen("detect.out","w",stdout);
	scanf("%d",&t);
	while(t--){
		tmp=0;
		cnt=0;
		memset(r,0,sizeof(r));
		memset(c,0,sizeof(c));
		memset(p,0,sizeof(p));
		scanf("%d%d%d%d",&n,&m,&l,&V);
		for(int i=1;i<=n;i++){
			scanf("%d%d%d",&c[i].d,&c[i].v,&c[i].a);
		}
		for(int i=1;i<=m;i++){
			scanf("%d",&p[i]);
		}
		for(int i=1;i<=n;i++){
			int temp=lower_bound(p+1,p+m+1,c[i].d)-p;
			if(p[temp]<c[i].d&&temp!=m){
				temp++;
			}
			int tep=c[i].v*c[i].v+2*c[i].a*(p[temp]-c[i].d);
			if(tep>V*V){
				cnt++;
			}else if(c[i].v*c[i].v+2*c[i].a*(p[m]-c[i].d)>V*V){
				cnt++;
			}
		}
		printf("%d ",cnt);
		for(int i=1;i<=n;i++){
			// printf("\n%d %d %d\n",i,c[i].h().first,c[i].h().second);
			if(c[i].h().first==-1||c[i].h().second==-1){
				continue;
			}
			r[c[i].h().first]++,r[c[i].h().second+1]--;
		}
		int ans=1;
		for(int i=0;i<=l+1&&ans<=m;i++){
			while(r[i]>=1){
				rg.push(i);
				sm.push(i);
				r[i]--;
			}
			if(i==p[ans]&&rg.size()&&(!val.size()||val.top()!=rg.top())){
				val.push(rg.top());
				fans.push(1);
				ans++;
			}else if(i==p[ans]){
				ans++;
			}
			while(r[i]<=-1){
				auto tap=rg.top();
				rg.pop();
				if(sm.size()&&sm.top()==tap){
					if(val.size()&&tap!=val.top()){
						sm.pop();
					}
				}else{
					int tp=0;
					while(val.size()&&val.top()>tap){
						val.pop();
						int tzp=fans.top();
						fans.pop();
						tp+=tzp;
					}
					int txp;
					if(fans.size()&&val.size()&&val.top()==tap){	
						txp=fans.top();
						fans.pop();
					}else{
						txp=0;
					}
					fans.push((tp==0)?txp:tp);
				}
				r[i]++;
			}
			if(rg.empty()){
				while(sm.size()){
					sm.pop();
				}
			}
		}
		while(val.size()){
			auto tap=rg.top();
			rg.pop();
			int tp=0;
			while(val.size()&&val.top()>tap){
				val.pop();
				int tzp=fans.top();
				fans.pop();
				tp+=tzp;
			}
			int txp;
			if(fans.size()&&val.size()&&val.top()==tap){	
				txp=fans.top();
				fans.pop();
			}else{
				txp=0;
			}
			fans.push((tp==0)?txp:tp);
		}
		ans=0;
		while(fans.size()){
			ans+=fans.top();
			fans.pop();
		}		
		printf("%d\n",m-ans);
		while(rg.size()){
			rg.pop();
		}
		while(sm.size()){
			sm.pop();
		}
		while(val.size()){
			val.pop();
		}
	}
	return 0;	
}